package com.vip.common.util;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 栅栏：所有线程必须同时到达栅栏位置，才能继续执行。  闭锁是为了 等待事件。闭锁是一次性对象。
 * 所有线程都到达了栅栏位置后，就会打开栅栏，所有线程被释放。栅栏被重置，以便下次使用。
 * @author LEON
 */
public class BarrierUtils {
    /**
     * 创建栅栏
     *
     * @param row
     * @param task
     */
    public static void createBarrier(int row, Runnable task) {
        CyclicBarrier barrier = new CyclicBarrier(row);
        for (int i = 0; i < row; i++) {
            Thread t = new Thread(() -> {
                try {
                    barrier.await();
                    task.run();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
            t.start();
        }
        // 重置栅栏
//        barrier.reset();
    }
}
